Daemon maintenance skip reasons reach a standing surface (#742) - #759
Daemon maintenance skip reasons reach a standing surface (#742)#759philcunliffe wants to merge 8 commits into
Conversation
A partition maintenance deliberately leaves fragmented (LLP 0217, LLP 0218) was stated only on surfaces an operator has to go looking for: a `hyp query maintain` line and a `maintenance.partition` span attribute. The daemon's hourly tick awaited `maintainCache` and discarded the report. The tick now summarizes that report into `DaemonStatus.maintenance` and persists it with the snapshot it already writes; `hyp status` renders the block, carries it under `--json`, and raises one warning diagnostic, and the tick logs one line when the count is nonzero. Retention is the last completed tick, whole: both reasons are re-derived from the partition cursor every tick, so the newest tick is the only current answer and a thawed partition leaves the surface by itself. Bounded by a fixed reason-key set and an 8-entry named list taken in the walk's own neediest-first order, with the exact total beside it. The reason ids are the span attribute names verbatim. Design record: LLP 0224, with Extended-by forward-refs on LLP 0217 and 0218. Co-Authored-By: Claude <noreply@anthropic.com>
neutral review - round 1Head reviewed: The reviewer went at the bound dimension by dimension rather than reading the cap Finding 3 is worth reading even though it is not this PR's to fix: after #747 Cleanup done, tree clean. Here is the review. VERDICT: findings PR #759 is well-built: the surface it adds is genuinely bounded in the dimension it set out to bound (entry count), the retention rule works as claimed, all 11 new tests discriminate, and 1. major —
|
| Input | Write side | Read side | Verdict |
|---|---|---|---|
| Number of named partitions (20 skipped, then 40 in a foreign file) | capped at 8, walk order preserved (dataset_00..dataset_07) |
capped at 8 again, break before the loop body |
bounded, both sides |
Partition tuple string k=v/k=v |
unbounded. 200 keys × 250-char values → a 51,489-char label. Realistic row-derived case → 217 chars | clamped to 120 by sanitizeLabel |
finding 1 |
| Dataset name | unbounded. 5,000 chars written verbatim | clamped to 120 | finding 1 |
| Display-hostile bytes in the label (ESC, LF, DEL, U+00AD, U+200B, U+202E) | all survive into status.json and into the daemon log's worst field; sanitizePathSegment strips only \x00-\x1f and path chars, so bidi/zero-width/DEL reach the directory name from a row's client_name |
ESC/LF/bidi/zero-width all stripped before render | finding 1; hyp status itself is safe |
| Number of distinct reason keys | fixed 2-key literal, nothing derived from the report | fixed 2-key literal; unknown keys never enter reasons (verified: compaction_from_the_future: 5 dropped) |
bounded |
Reason payload (dataFiles, failedAt) |
typed guards (typeof === 'number' / 'string') |
nonNegativeInt / sanitizeLabel (120) |
bounded |
status.json total size across many ticks |
persist is Object.assign + full rewrite; every tick overwrites maintenance whole. 8 pathological entries → 102,063 bytes; the very next clean tick → 291 bytes |
n/a | no accumulation; a clean tick does shrink it back. LLP 0224's "bounded constant, no growth over a daemon's lifetime" holds in the count dimension, not the string-length dimension |
skippedTotal vs the named list |
exact count of partitions matching a named reason | Math.max(recordedTotal, partitions.length) — never smaller than the list it labels (verified: recorded 1, list 3 → 3) |
honest |
partitionsVisited |
report.partitions.length; the budget break happens before reports.push, so only genuinely-visited partitions are counted |
falls back to partitions.length with no floor at skippedTotal → 5 of 0 partitions |
finding 2 |
... and N more arithmetic |
n=0 → no block, no diagnostic. n=7 → 7 named, no more-line. n=8 → 8 named, no more-line. n=9 → 8 named, "and 1 more". n=20 → 8 named, "and 12 more" | same | correct at every boundary |
| Empty / non-string partition tuple | {} → all; undefined → all; {a: 1, b: 'ok'} → b=ok (non-string value silently dropped — unreachable, CachePartitionMeta.partition is Record<string,string> from path parsing) |
n/a | safe; the last case is a nit, not a finding |
Reason ids not in the vocabulary (baseline-gate convergence, rebaseline, a just-rewritten ineffective partition, #747's failed) |
skipReasonOf returns undefined; not counted in skippedTotal, not in reasons, not in the list |
n/a | skippedTotal counts partitions skipped for a named reason, exactly as MaintenanceSkipSnapshot.skippedTotal's JSDoc says. Nothing is miscounted as one of the two named ids; see finding 3 for what stays off |
Old status.json with no maintenance key |
n/a | isPlainObject(undefined) → null. No throw, --json emits null, text renders nothing, overall: healthy |
forward/backward compatible |
Missing or unparseable tickAt |
n/a | returns null outright |
safe |
Future tickAt |
n/a | formatEntrypointAge → just now (negative delta < 60) |
acceptable; pre-existing helper |
Also checked, clean
Ran (fresh npm install, exit 0):
npm test— 4036 tests, 4035 pass / 0 fail / 1 skipped, matching the PR's claim.npm run typecheck— clean.node --test test/core/status-maintenance-skips.test.js— 11/11, 807 ms total; the daemon test is 623 ms.npm run smoke -- status_diagnostics— ok.cache_lifecycle_maintenance— ok.daemon_foreground_start_stop— ok. (package_bin_boot/walkthrough_picker_to_first_querynot run: red on master per package_bin_boot is red on master: the --help banner changed and the smoke still pins the old copy #758/walkthrough_picker_to_first_query is red on master, and no smoke runs in CI #750.)
Discrimination, re-derived (3 of the author's 5, all matched exactly):
git checkout c483c1a -- src/core/daemon/runtime.js→ 1 fail / 10 pass,the daemon maintenance tick persists what it left fragmented into status.json. ✓- Delete both cap lines (write
continue+ readbreak) → 2 fail / 9 pass,the named list is capped...anda foreign status file is capped.... ✓ - Delete
if (p.compacted || p.rebaselined) return undefined→ 1 fail / 10 pass,a converged, rebaselined, or freshly rewritten partition is not on the surface. ✓
The daemon test as a CI citizen (test/core/status-maintenance-skips.test.js:449): bounded 30 s deadline with 100 ms polling; assert.ok(maintenance, 'no maintenance snapshot ever reached status.json') gives a real failure message; not vacuous (asserts skippedTotal === 1, the exact reasons object, dataset and reason); finally does handle.stop(), await handle.done, and fs.rm(hypHome, { recursive: true, force: true }); installSignalHandlers: false. The 600 ms interval_minutes: 0.01 against a 30 s budget is ~50 ticks of headroom, and the observed run needed one — stable on a slow runner. The assert.match(diagnostic.message, /3 partitions fragmented|leaving 3 partitions fragmented/) at line 304 is a weak assertion (the second alternative subsumes the first) but not vacuous. No flake risk found. Not covered: the ... and N more render at exactly 8 vs 9 (I verified both by hand, both correct).
hyp status contract: text block gated on skippedTotal > 0, --json always carries the key (null before any tick) — consistent with LLP 0224#consequences bullet 1 and with the surrounding renderer's conventions. A never-ticked daemon renders nothing in text and null in JSON — no undefined, no 0 partitions skipped. --json uses snake_case (tick_at, partitions_visited, skipped_total, data_files, failed_at) matching the rest of renderStatusJson; the key is skipped where the internal field is partitions, which is fine since a JSON consumer reads capping off skipped_total vs skipped.length. The maintenance_partitions_skipped diagnostic is severity: 'warning' and the kind is not in degradingKinds (new Set(['config_missing', 'config_unreadable']) at status.js:1345), so it cannot reach the overall computation's degrade branches — confirmed by observation (overall: healthy in every probe that raised it). StatusDiagnosticKind is extended correctly in the union. No in-repo consumer pins the --json key set exhaustively; the status_diagnostics and cli_bundled_plugins_activated smokes only assert exit 0 and parseability.
LLP 0224: number is free — I enumerated llp/02[19-25] across master and all 30 remote branches; 0219 (fix/issue-736), 0220 (fix/issue-737/#747), 0221 (fix/issue-744), 0222 (fix/one-pushdown-converter), 0223 (fix/issue-746), 0225 (fix/issue-752) are claimed, 0224 only by this branch. Every @ref added by the PR resolves: 0164#not-liveness-gated, 0218#verdict-outranks-error, 0224#{status-file-is-the-surface,last-tick-only,reason-ids-are-span-attribute-names}, plus 0199#{neediest-first,baseline-gate}, 0217#{record-effectiveness,retry-on-writer-change}, 0218#report-the-spent-attempt referenced in prose. Claims verified against code: the reason ids are the span attribute names verbatim (maintenance.js:366, :379); walk order is neediest-first with no re-sort (maintenance.js:135-138, and summarizeMaintenanceSkips adds none); the summarizer stats nothing; partitionsVisited genuinely excludes budget-cut partitions. The Extended-by: additions are additive — 0217 appends ; [LLP 0224]... to an existing line, 0218 adds a new line after **Related:**; nothing either doc settled is rewritten. LLP 0224:95-96 is the one claim that does not hold (finding 1).
Conventions: no em dash (U+2014) anywhere in the diff — grepped the full patch, zero hits. No statement-terminating semicolons in the new JavaScript (the four ; hits are sentence punctuation inside pre-existing prose comments). No @typedef in any touched file — the two new types in src/core/daemon/types.d.ts are a type union (MaintenanceSkipReason) and two interfaces (MaintenanceSkippedPartition, MaintenanceSkipSnapshot), imported via @import. No inline import('...') types. Type-import specifiers are root-anchored .js paths throughout ('../../../src/core/daemon/types.js', the new '../../../src/core/cache/types.js' in status.js, '../../src/core/cache/types.js' and '../../hypaware-plugin-kernel-types.js' in the test).
On weight. +1035 lines is a lot for a status field, but the split is defensible: 495 test, 162 LLP, and of the ~380 production lines a large majority is JSDoc prose. The functional core is roughly 90 lines. The one place I considered calling gold-plating — the ~60-line maintenanceSkipsFromStatus re-validating a file only the daemon writes — is the repo's established convention (recentEntrypointsFromSources does the same for the same stated reason), and finding 1 shows the read side is currently the only thing standing between a row-derived label and a terminal, so it is earning its keep. I would not cut anything. If asked to trim, the honest target is the JSDoc-to-code ratio in types.d.ts, not any of the logic.
|
Review complete. Findings below; the tree is clean and all scratch removed. neutral review - round 2 (final)Head reviewed: The round-1 major is genuinely fixed and the fix is load-bearing under mutation. The two new tests both discriminate, and the on-disk-bytes assertion is not vacuous. What I found this round is one false sentence left standing in LLP 0224 (a different sentence from the one round 1 flagged, and one this PR's own new code comment contradicts), one case where the new fallback phrase makes a positively wrong claim instead of an obviously blank one, and three nits. VERDICT: findings None of them is ship-blocking. The feature works, the round-1 major is closed, and everything round 1 cleared still holds. Findings 1 and 2 are worth a follow-up commit if triage is willing to take one; findings 3-5 are nits and I would not hold the PR for any of them. 1. minor -
|
neutral triage - shipReview budget exhausted with five residual findings. All five are preferences. Baseline first, because it is what the residuals are weighed against: before this PR The finding that needed a real decisionRound 2 found LLP 0224 still saying "Nothing from a row, a prompt, a credential, or The argument for blocking was that a false doc invites a future refactor to delete So: a false sentence about correct, self-documenting code is a doc bug, just an The other fourThe fallback phrase ( The rest: a test comment claiming more than its assertion proves (the floor makes the Verified at head |
…r a person (#752) (#760) * Escape captured control sequences where a query result is rendered for a person (#752) Co-Authored-By: Claude <noreply@anthropic.com> * Renumber LLP 0224 to 0225: 0224 is claimed by PR #759 (#752) * Fix round-1 review findings on escape-for-display (#752) - LLP 0225 Verification: separate the six tests that discriminate the fix from the two that pass pre-fix by construction and guard preserved behaviour, confirmed by re-running the three new test files against the pre-fix sources and by mutation. - format.js: move the receipt rationale and its @ref out of the `full` param's description and into the function description, so the @PARAM list is contiguous again. - overview.js: clip before escaping for the model and tool columns, matching format.js's order, so a `\uXXXX` escape can no longer be cut in half at MAX_MODEL_WIDTH. cell() gains an optional width argument that truncates the raw value before escapeForDisplay. - LLP 0225 Consequences: record the markdown newline behaviour change alongside the table one. - Add a test pinning table column width to the escaped header rather than the raw column name (the one surviving mutant from review). --------- Co-authored-by: test <test@example.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: test <test@test.com>
Two textual conflicts, both anticipated by the PR description, plus two semantic ones git could not flag. src/core/daemon/runtime.js, runMaintenance: #747 (LLP 0220) replaced the `withSpan` wrapper with a hand-rolled `tracer.startActiveSpan`, because the tick's clean/degraded status is only knowable once the report is in hand. Kept that skeleton, and put this branch's three statements back inside its `try` after `const report`: `summarizeMaintenanceSkips`, `persist`, and the `daemon.maintenance_skipped` line. The span attributes compose, with #747's `partitions_failed` / `partitions_maintained` beside this branch's `partitions_visited` / `partitions_skipped`, and #747's `setStatus` stays last so it still reads the finished report. llp/0218, the header: both sides appended an `**Extended-by:**` line. Merged to one line carrying LLP 0220 then LLP 0228, separated by `; `. LLP number collision: master landed 0224-desktop-setup-second-pass, so this branch's 0224-maintenance-skips-are-a-standing-surface was a second claimant on the same number and every `@ref LLP 0224#status-file-is-the-surface` would have been ambiguous. Renumbered the later claimant to 0228 per LLP 0156, with every inbound reference swept (llp/0217's forward-ref, the doc title, and the refs in src/core/daemon/{runtime,status,types.d}.js, src/core/commands/ status.js, and the test). Refs carrying 0224's own anchors (#repair-surface, #ask-once-per-pick) are the desktop doc's and were left alone. 0226 and 0227 are already claimed by open branches, so 0228 is the first free number above the highest claimed anywhere. MaintenanceReport.totalFailed: #747 made the field required, so this branch's test fixture no longer typechecked. Derived it from the partitions like every other total, and pinned the interaction it exposes with a new test: a partition carrying #747's `failed` is this tick's error, not a skip, so it stays off the skip surface and keeps its own per-partition `daemon.maintenance_failed` line (LLP 0220#this-tick-versus-a-recorded-one). npm test and npm run typecheck both produce a failure set byte-identical to an origin/master worktree in the same environment (23 test failures, 1 typecheck error, all pre-existing and environmental). The PR's own suite is 14/14. Smokes cache_lifecycle_maintenance, status_diagnostics, and daemon_foreground_start_stop are green. Co-Authored-By: Claude <noreply@anthropic.com>
neutral triage - re-triage after the master merges - shipHead triaged: What was verified at this headThe branch took two master merges since the last triage (
Deferred, all non-blocking (on #764)
The stale PR bodyThe body still says the doc is LLP 0224 and describes #747 as "not merged, not depended on" with a proposed conflict resolution. Judged a preference, not a blocker: the body was accurate when written, the resolution it proposed is exactly what the merge commits executed (verified above), the tree is what merges, and this note is the on-thread correction. For any future reader of the body: read LLP 0228 wherever it says 0224, and the "#747 interaction" section is history that has since played out as described. Follow-ups: #764 (open, |
The forward-ref was written when this document was LLP 0224, and the 0224 to 0226 to 0228 renumbering left the link one step behind. 0226 on master is the prune decision, so the link resolved to the wrong document.
neutral triage - re-triage after one doc commit - shipHead triaged: The delta
Verified at this head
One new non-blocking finding (on #764 as item 7)The rewritten body's "Known, deferred to #764" paragraph still says the Follow-ups: #764 (open). |
Master gained #792, which adds a `proxy trust` section to the same status render and the same collector LLP 0228's maintenance-skip summary lands in. The two are conceptually independent, so every conflict resolved as a union: - src/core/commands/status.js: both imports kept (`describeMaintenanceSkipReasons` and `ENV_VAR_NAME`). - src/core/daemon/status.js: one `@import` line carrying both `MaintenanceSkip*` and `ProxyTrustReport`, plus 0228's cache-types import. - src/core/daemon/status.js: `collectHypAwareStatus` returns both `maintenance` and `proxyTrust`. - src/core/daemon/types.d.ts: `HypAwareStatusReport` carries both fields with their own doc comments. The render bodies merged without conflict and stay in separate places: `proxy trust` after `recent clients`, `maintenance` after `first sync`, each still gated on its own condition, neither swallowing the other's spacing. #792's tri-state (`null` when a probe could not run) and its darwin-plus-CA gate are untouched. LLP 0228 is unique across origin/master, every remote branch, and llp/tombstones after the merge. Co-Authored-By: Claude <noreply@anthropic.com>
neutral triage - re-triage after the #789/#792/#782 master merge - shipHead triaged: The merge, verified rather than trustedThe only overlap with the three new master PRs is #792, which lands a
DeferredUnchanged and already on #764 (items 1-4 and 7); nothing new to add. Both prior triage markers and the Follow-ups: #764 (open). |
# Conflicts: # src/core/commands/status.js
neutral triage - re-triage after the CI-refresh master merges - shipHead triaged: The delta since the last triage (
|
Closes #742.
A partition maintenance deliberately leaves fragmented (LLP 0217's
compactionIneffective, LLP 0218'scompactionAttemptFailed) was stated ontwo surfaces you have to go looking for: a
hyp query maintainline and amaintenance.partitionspan attribute. The daemon, which runs the walkhourly, awaited
maintainCacheand dropped the report on the floor. Anoperator who never ran the command by hand and did not have tracing on when
the tick ran had no way to find a frozen partition at all.
Design record: LLP 0228 (new), with
Extended-by:forward-refs added toLLP 0217 and LLP 0218. Nothing either of those settled is edited.
The surface, and what was rejected
DaemonStatus.maintenanceinstatus.json, written by the maintenance tickthrough the daemon's existing
persist();hyp statuslifts it, renders amaintenance:block, carries it under--json, and raises onemaintenance_partitions_skippedwarning diagnostic. Plus onedaemon.maintenance_skippedfileLogline per tick when the count isnonzero. That is #742's option 3: the log line is the record, the status file
is the discovery.
This reuses LLP 0164's route for LLP 0164's reason. The daemon is the only
process that runs the walk;
hyp statusactivates no plugins and reads nocache, so a status command that re-derived the answer would be firing a second
maintenance walk (metadata loads, data-file stats) to render a status block.
Rejected:
fileLogline alone (Daemon maintenance skip reasons are visible only in spans, never in a standing daemon surface #742's option 1): a record of a tick, not adescription of a state. It scrolls away, and it is the same shape of surface
LLP 0218's context section already calls insufficient for the failing tick.
report away is the entire defect.
written on every tick, and is already how
hyp statuslearns daemon-onlyfacts.
overalltodegraded: the daemon is running, capture works,and queries answer. This sits with
recent_errorsand a failed clientaction, not with a missing config.
Nothing about when a partition is compacted moves. The tick reads the report
it already produced and stats nothing: proving a skipped partition is also
still fragmented is exactly the per-tick cost the LLP 0199 baseline gate
exists to avoid, and LLP 0217/0218 both already declined to pay it.
Retention rule and its bound
The last completed tick, whole. Every tick overwrites the snapshot,
including one that skipped nothing (which writes zeros).
Why: both reasons are read off the partition cursor on every tick. They
describe a state that is still true, not an event that happened once. So the
newest tick is the only current answer, and a partition that thaws (a
--forcerewrite, new data flushing in, the next writer generation) drops offthe surface by itself, with no expiry rule and nothing to invalidate. That is
the same self-clearing property LLP 0218 built into the report. A last-N
history would go stale against the cursor, would need an eviction rule of its
own, and would duplicate the
fileLog, which is already the timestampedappend-only record.
Bounded three ways, so it cannot grow:
reasonsis a fixed key set: one integer per reason id.partitions(the named ones) is capped atMAX_SKIPPED_PARTITIONS_REPORTED= 8, taken in walk order, which is LLP 0199#neediest-first (descending live
data-file count) - so the named ones are the worst ones and the cap costs no
sort of its own.
skippedTotalis the exact count, so the cap is never a lie; the renderprints
... and N more (hyp query maintain --dry-run lists them all).The cap and the label sanitizing are applied on write as well as on read
(review round 1 found the write side had only the cap, which made a sentence in
the LLP untrue;
sanitizeLabel(...)now runs on the dataset and partitionlabels before they reach
status.json, which fixes the daemon log'sworstfield for free). The read side re-applies both, for the reason
recentEntrypointsFromSourcesstates in the same file: core reads a file,must not assume this build wrote it, and everything read is about to be printed
to a terminal.
Secret-safety: each entry carries a dataset name, a partition tuple rendered
as
k=v/k=v(the same labelhyp query maintainprints), a reason id, andeither the recorded rewrite's data-file count or the ISO timestamp of the
spent attempt. Dataset and partition identifiers plus kernel-side counters.
No row data, no prompts, no credentials, no config values are anywhere on the
path.
Reason vocabulary
The ids are the
maintenance.partitionspan attribute names, verbatim,which are themselves named after the
MaintenancePartitionReportfields:compaction_ineffectiveMaintenancePartitionReport.compactionIneffective, span attrcompaction_ineffectivecompaction_attempt_failedMaintenancePartitionReport.compactionAttemptFailed, span attrcompaction_attempt_failedOne spelling across the trace, the status file,
hyp statustext,--json,and the daemon log. No new name was minted.
Deliberately not reasons: plain convergence (LLP 0199#baseline-gate) is the
healthy majority of every cache, so naming it would put most partitions on the
surface and none of the interesting ones; a rebaseline (LLP 0207) is work the
tick did; a partition the tick rewrote ineffectively is a run that ran (it
lands on the next tick's snapshot as a skip, which is when it is standing
state); and #747 / LLP 0220's per-partition
failedis this tick's error ratherthan a stated reason for attempting nothing, so it stays off this surface and
keeps its own
daemon.maintenance_failedline.What the #747 merge actually did
#747 is in
masterand this branch is merged up to it. The two hunks thatcollided were resolved as proposed:
src/core/daemon/runtime.js,runMaintenance: master'stracer.startActiveSpanskeleton is kept, with itsreport.totalFailedhandling and its
partitions_failed/partitions_maintainedattributes.Inside it, after
const report = ..., this PR's three statements arereinstated:
summarizeMaintenanceSkips(report),persist({ maintenance }),and the gated
daemon.maintenance_skippedwarn line, withpartitions_visited/partitions_skippedset beside master's attributes.llp/0218, the header: oneExtended-by:line carrying both entries(LLP 0220 and this doc), separated by
;, per the corpus convention.The composed behaviour is pinned by a test rather than by argument:
a partition this tick failed on is not a skipfeeds a #747-shaped report(
{ failed: true, errorKind: ... }) throughsummarizeMaintenanceSkipsandasserts
skippedTotal: 0, no text block, and no diagnostic. LLP 0220#this-tick-versus-a-recorded-onesays the same thing from the other side. If alater request wants this tick's failures standing too, the shape takes it
additively: a third reason id and a third count key, no shape change.
Tests and discrimination evidence
test/core/status-maintenance-skips.test.js, 14 tests at this head (11originally, plus the two round-1/round-2 regression pins and the #747
composition test above). Every number below was observed by editing the hunk
out, running, and restoring:
src/core/daemon/runtime.js)the daemon maintenance tick persists what it left fragmented into status.json--jsonkey (src/core/commands/status.js)hyp status names the frozen partitions...andan install with nothing frozen...testscollectHypAwareStatushyp status names the frozen partitions...the named list is capped in the walk order...anda foreign status file is capped, cleaned...sanitizeLabelsummarizeMaintenanceSkips sanitizes and clamps hostile dataset and partition labels on write...if (p.compacted || p.rebaselined) return undefinedguarda converged, rebaselined, or freshly rewritten partition is not on the surfaceTwo of them are not pure-unit: one seeds a partition frozen exactly the way
#723's was, runs the real
maintainCache, and summarizes what comes back (sothe vocabulary is pinned to what a real walk produces); one boots the real
runDaemonwithinterval_minutes: 0.01over that cache and pollsstatus.jsonfor the snapshot.Checks: CI green on all 9 checks at this head. At the last fully re-measured
head (
69a0516, freshnpm install):npm test4037 pass / 0 fail / 1skipped;
npm run typecheckclean; smokescache_lifecycle_maintenance,status_diagnostics,daemon_foreground_start_stopall ok.What I could not verify
runDaemoninforeground with a 600 ms maintenance interval; nothing here exercises
launchd/systemd, a real hourly cadence, or a long-lived process.
total, and the
... and N moreline are pinned by unit test only.walkthrough_picker_to_first_querywas not run: it fails onmasterfor anunrelated reason (walkthrough_picker_to_first_query is red on master, and no smoke runs in CI #750).
--jsonmaintenancekey is new, so no existing consumer pins it; Idid not survey downstream consumers of
hyp status --jsonoutside thisrepo.
Known, deferred to #764
Non-blocking items triage left open rather than fixing here: the privacy
sentence at
llp/0228:102-104, the foreign-file reason floor, one over-claimingtest comment,
failedAtunsanitized on the write side (our own code only everwrites an ISO timestamp there, and the read side clamps it), and, until commit
ca4510c, one leftover of the renumbering: theExtended-by:entry this PR addsto
llp/0218read LLP 0226 and linked a filename that does not exist, whileLLP 0226 on
masteris the prune decision, so the forward-ref resolved to thewrong document. That one is now fixed on this branch and points at LLP 0228;
the rest remain tracked on #764.